#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>

int main()
{
  pid_t ret=fork();
  if(ret<0)
  {
    perror("fork error\n");
    return -1;
  }
  else if(ret==0)
  {
    //打印
    printf("i am a child process\n");
    //睡眠5秒之后退出
    sleep(5); 
    exit(10);
  }
  //使用wait处理子进程
  /*
  int status;
  //接收退出子进程的id，返回值为status
  ret=wait(&status);
  if((status&0x7f)==0)
  {
     printf("%d 子进程退出~ 返回值为%d\n",ret,status);
  }
  else
  {
    printf("%d 子进程退出异常 返回值为%d\n",ret,status);
  }*/
  //用waitpid处理子进程
  int status,t;
  //waitpid处理，如果没有子进程退出，则返回0，成功则返回子进程的pid,失败则返回-1
  while((t=waitpid(-1,&status,WNOHANG))==0)
  {
    printf("没有子进程退出~\n");
    sleep(1);
  }
  if(t<0)
  {
    perror("fork error");
    return -1;
  }
  if((status&0x7f)==0)
  {
    //退出返回值为低16位向右右移8位的值 与 0xff
    printf("%d 子进程退出~ 返回值为%d\n",t,(status>>8)&0xff);
    printf("异常信号值为: %d\n",status&0x7f);
  }
  else{
    printf("%d 子进程异常退出~ 返回值为%d\n",t,(status>>8)&0xff);
    printf("异常信号值为 %d\n",status&0x7f);
  }
  return 0;
}
